home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Leser 15 / Amiga Plus Leser CD 15.iso / Tools / Development / yacas_alg / yacas_morphos / share / yacas / include / patterns.h < prev    next >
Encoding:
C/C++ Source or Header  |  2002-03-13  |  3.0 KB  |  100 lines

  1.  
  2. #ifndef __patterns_h__
  3. #define __patterns_h__
  4.  
  5. // pattern matching code.
  6. //
  7. // General idea: have a class that can match function parameters
  8. // to a pattern, check for predicates on the arguments, and return
  9. // whether there was a match.
  10. //
  11. // First the pattern is mapped onto the arguments. Then local variables
  12. // are set. Then the predicates are called. If they all return true,
  13. // Then the pattern matches, and the locals can stay (the body is expected
  14. // to use these variables).
  15. //
  16.  
  17. #include "yacasbase.h"
  18. #include "lisptype.h"
  19. #include "grower.h"
  20. #include "lispenvironment.h"
  21.  
  22. class YacasParamMatcherBase : public YacasBase
  23. {
  24. public:
  25.     virtual ~YacasParamMatcherBase();
  26.     virtual LispBoolean ArgumentMatches(LispEnvironment& aEnvironment,
  27.                                         LispPtr& aExpression,
  28.                                         LispPtr* arguments)=0;
  29. };
  30.  
  31. class MatchAtom : public YacasParamMatcherBase
  32. {
  33. public:
  34.     MatchAtom(LispStringPtr aString);
  35.     virtual LispBoolean ArgumentMatches(LispEnvironment& aEnvironment,
  36.                                         LispPtr& aExpression,
  37.                                         LispPtr* arguments);
  38. protected:
  39.     LispStringPtr iString;
  40. };
  41.  
  42. class MatchSubList : public YacasParamMatcherBase
  43. {
  44. public:
  45.     MatchSubList(YacasParamMatcherBase** aMatchers, LispInt aNrMatchers);
  46.     ~MatchSubList();
  47.     virtual LispBoolean ArgumentMatches(LispEnvironment& aEnvironment,
  48.                                         LispPtr& aExpression,
  49.                                         LispPtr* arguments);
  50. protected:
  51.     YacasParamMatcherBase** iMatchers;
  52.     LispInt iNrMatchers;
  53. };
  54.  
  55.  
  56. class MatchVariable : public YacasParamMatcherBase
  57. {
  58. public:
  59.     MatchVariable(LispInt aVarIndex);
  60.     virtual LispBoolean ArgumentMatches(LispEnvironment& aEnvironment,
  61.                                         LispPtr& aExpression,
  62.                                         LispPtr* arguments);
  63. protected:
  64.     LispInt iVarIndex;
  65.     LispStringPtr iString;
  66. };
  67.  
  68.  
  69. // YacasPatternPredicateBase defines the interface to an object
  70. // that matches a set of arguments to a function to a pattern.
  71. //
  72. class YacasPatternPredicateBase : public YacasBase
  73. {
  74. public:
  75.     YacasPatternPredicateBase(LispEnvironment& aEnvironment,
  76.                               LispPtr& aPattern,
  77.                               LispPtr& aPostPredicate);
  78.     ~YacasPatternPredicateBase();
  79.     LispBoolean Matches(LispEnvironment& aEnvironment,
  80.                         LispPtr& aArguments);
  81.     LispBoolean Matches(LispEnvironment& aEnvironment,
  82.                         LispPtr* aArguments);
  83.  
  84. protected:
  85.     YacasParamMatcherBase* MakeParamMatcher(LispEnvironment& aEnvironment, LispObject* aPattern);
  86.     LispInt LookUp(LispStringPtr aVariable);
  87.  
  88. protected:
  89.     void SetPatternVariables(LispEnvironment& aEnvironment, LispPtr* arguments);
  90.     LispBoolean CheckPredicates(LispEnvironment& aEnvironment);
  91.  
  92. protected:
  93.     CDeletingArrayGrower<YacasParamMatcherBase*> iParamMatchers;
  94.     CArrayGrower<LispStringPtr> iVariables;
  95.     CDeletingArrayGrower<LispPtr*> iPredicates;
  96. };
  97.  
  98.  
  99. #endif
  100.